package leetcode;

/**
 * 两数相加
 * @author Administrator
        给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照
         逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
        如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。	
	您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
	
	示例：	
	输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
	输出：7 -> 0 -> 8
	原因：342 + 465 = 807

 */

class ListNode2 {
	int val;
	ListNode2 next;

	ListNode2(int x) {
		val = x;
	}
}

public class Demo2 {
	
    public static ListNode2 addTwoNumbers(ListNode2 l1, ListNode2 l2) {
    	
    	ListNode2 result = new ListNode2(0);
    	ListNode2 returnIndex = result;
    	int carryFlag = 0;
    	while(l1 != null || l2 != null || carryFlag != 0) {
    		int a = l1 != null ? l1.val : 0;
    		int b = l2 != null ? l2.val : 0;
    		int tempSum = a + b + carryFlag;
    		if(tempSum >= 10) {    			
    			carryFlag = 1;
    			tempSum = tempSum - 10;
    		} else {
    			carryFlag = 0;
    		}
   
    		result.val = tempSum;

    		if(l1 != null) {
    			l1 = l1.next;	
    		}
    		if(l2 != null) {
    			l2 = l2.next;	
    		}
    		
    		if(l1 == null && l2 == null && carryFlag == 0) {
    			
    		} else {
    			result.next = new ListNode2(0);
        		result = result.next;
    		}
    		
    		
    	}    	
    	
    	return returnIndex;
    }
    

	public static void main(String args[]) {
    	ListNode2 l1 = new ListNode2(2);
    	ListNode2 l2 = new ListNode2(5);
    	    	    	
    	l1.next = new ListNode2(4);
    	l1.next.next = new ListNode2(3);    	   
    	
    	l2.next = new ListNode2(6);
    	l2.next.next = new ListNode2(4);  
    	
    	ListNode2 result = addTwoNumbers(l1, l2);
    	
    	while(result != null) {
    		System.out.println(result.val);
    		result = result.next;
    	}
    }
    
}
